#! /bin/bash
### BEGIN INIT INFO
# Provides:          gunicorn-initscript
# Required-Start:    $syslog
# Required-Stop:     $syslog
# Should-Start:      $lighttpd
# Default-Start:     30 2 3 4 5
# Default-Stop:      70 0 1 6
# Short-Description: virtualenv + gunicorn + lighttpd debian init script
# Description:       virtualenv + gunicorn + lighttpd debian init script
### END INIT INFO
#
# Init.d script for Debian Linux
#
# Enable with # update-rc.d epsgio defaults

# Do NOT "set -e"

NAME="epsgio"
PROJECT=/var/www/epsg.io
FLASK_APP=$PROJECT/app.py
VIRTUALENV=$PROJECT/venv
APP=app:app
PORT=8000
LOGDIR=$PROJECT
USER=www-data
GROUP=www-data
IP=127.0.0.1
WORKERS=4
DESC=$NAME
LOGFILE="$LOGDIR/$NAME.log"
PIDFILE="$PROJECT/$NAME.pid"
CMD="$VIRTUALENV/bin/gunicorn --user $USER --group $GROUP --daemon --workers $WORKERS --bind $IP:$PORT --pid $PIDFILE --name $NAME --log-file $LOGFILE --log-level info $APP"

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
# and status_of_proc is working.
. /lib/lsb/init-functions

#
# Function that starts the daemon/service
#
do_start() {
  # Return
  #   0 if daemon has been started
  #   1 if daemon was already running
  #   2 if daemon could not be started
  if [ -e $PIDFILE ]; then
    return 1
  fi
  cd $PROJECT
  . $VIRTUALENV/bin/activate
  if [[ $EUID -ne 0 ]]; then
      $CMD
  else
      sudo -u $USER $CMD
  fi
  if [ $? = 0 ]; then
    return 0
  else
    return 2
  fi
}

#
# Function that stops the daemon/service
#
do_stop() {
  # Return
  #   0 if daemon has been stopped
  #   1 if daemon was already stopped
  #   2 if daemon could not be stopped
  #   other if a failure occurred
  if [ -f $PIDFILE ]; then
    PID=`cat $PIDFILE`
    rm $PIDFILE
    kill -15 $PID
    if [ $? = 0 ]; then
      return 0
    else
      return 2
    fi
  else
    return 1
  fi
}

do_reload() {
  if [ -f $PIDFILE ]; then
    PID=`cat $PIDFILE`
    kill -HUP $PID
    return $?
  fi
  return 2
}

case "$1" in
  start)
  [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
  do_start
  case "$?" in
    0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
    2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
  esac
  ;;
  stop)
  [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
  do_stop
  case "$?" in
    0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
    2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
  esac
  ;;
  restart)
  log_daemon_msg "Restarting $DESC" "$NAME"
  do_stop
  case "$?" in
    0|1)
    do_start
    case "$?" in
      0) log_end_msg 0 ;;
      1) log_end_msg 1 ;; # Old process is still running
      *) log_end_msg 1 ;; # Failed to start
    esac
    ;;
    *)
      # Failed to stop
    log_end_msg 1
    ;;
  esac
  ;;
  reload)
  log_daemon_msg "Reloading $DESC" "$NAME"
  do_reload
  case "$?" in
    0) log_end_msg 0 ;;
    *) log_end_msg 1 ;;
  esac
  ;;
  *)
  echo "Usage: $SCRIPTNAME {start|stop|restart|reload}" >&2
  exit 3
  ;;
esac

:

